'use strict';

module.exports = core;

const path = require('path')
const semver = require('semver')
const colors = require('colors/safe')
const userHome = require('user-home')
const pathExists = require('path-exists').sync
const commander = require('commander')
const log = require('@ayuan-cli/log')
const exec = require('@ayuan-cli/exec')

const { LOWEST_NODE_VERSION, DEFAULT_CLI_HOME } = require('./constant')
const pkg = require('../package.json')

let args, config
const program = new commander.Command()

async function core() {
    try {
        checkPkgVersion()
        checkNodeVersion()
        checkRoot()
        checkUserHome()
        checkInputArgs()
        checkArgs()
        checkEnv()
        // await checkGlobalUpdate()
        registerCommand()
    } catch (e) {
        log.error(e.message)
        if (process.env.LOG_LEVEL === 'verbose') { // debug 模式
            console.log(e)
        }
    }
}

function registerCommand() {
    program
        .name(Object.keys(pkg.bin)[0])
        // 使用命令
        .usage('<command> [options]')
        // 版本
        .version(pkg.version)
        // 配置事件
        .option('-d --debug', '是否开启调试模式', false)
        .option('-tp --targetPath <targetPath>', '是指定本地调试文件路径','')

    program
        .command('init [projectName]')
        .option('-f --force', '是否强制初始化')
        .action(exec)

    // 监听事件
    program.on('option:debug', function () {
        if (program.opts().debug) {
            process.env.LOG_LEVEL = 'verbose'
        } else {
            process.env.LOG_LEVEL = 'info'
        }
        log.level = process.env.LOG_LEVEL
    })

    // 指定targetPath
    program.on('option:targetPath', function () {
        process.env.CLI_TARGET_PATH = program.opts().targetPath
    })

    // 未知任何命令
    program.on('command:*', function (cmdArr) {
        // 未知命令
        console.log(colors.red(`未知命令：${cmdArr[0]}`))
        // 可用命令
        const availableCommands = program.commands.map(cmd => cmd.name())
        if (availableCommands && availableCommands.length > 0) {
            console.log(colors.green(`可用命令：${availableCommands.join(',')}`))
        }
    })
    // 处理参数，没有被使用的选项会存放在program.args数组中
    program.parse(process.argv)

    // TODO
    // console.log(program.args)
    // if (program.args && program.args.length < 1) {
    //     // 打印帮助文档
    //     program.outputHelp()
    // }
}

async function checkGlobalUpdate() {
    const curPageVersion = pkg.version
    const { getLatestNpmVersions } = require('@ayuan-cli/get-npm-info')
    const lastVersion = await getLatestNpmVersions('ayaun-cli')
    if (curPageVersion && lastVersion && semver.gt(lastVersion,curPageVersion)) {
        log.warn(colors.yellow('更新提示：',`当前使用版本为${curPageVersion}，ayuan-cli 最新版本为${lastVersion}，请使用 npm install -g ayuan-cli 进行更新`))
    }
}

function checkEnv() {
    // TODO
    const dotenv = require('dotenv')
    const dotenvPath = path.resolve(userHome, '.env')
    let config
    if (pathExists(dotenvPath)) {
        // 读取环境变量ENV
        config = dotenv.config({
            path: dotenvPath
        });
    }
    createDefaultConfig()
    // log.verbose('环境', process.env);
}

function createDefaultConfig() {
    const cliConfig = {
        home: userHome
    }
    if (process.env.CLI_HOME) {
        cliConfig['cliHome'] = path.join(userHome, process.env.CLI_HOME)
    } else {
        cliConfig['cliHome'] = path.join(userHome, DEFAULT_CLI_HOME)
    }
    process.env.CLI_HOME_PATH = cliConfig.cliHome
}

function checkInputArgs() {
    const minimist = require('minimist')
    args = minimist(process.argv.slice(2))
}

// 开启 debug 模式处理
function checkArgs() {
    if (args.debug) {
        process.env.LOG_LEVEL = 'verbose'
    } else {
        process.env.LOG_LEVEL = 'info'
    }
    log.level = process.env.LOG_LEVEL
}

function checkUserHome() {
    if (!userHome || !pathExists(userHome)) {
        throw new Error(colors.red('当前登录用户主目录不存在！'))
    }
}

function checkRoot() {
    const rootCheck = require('root-check')
    rootCheck()
}

function checkNodeVersion() {
    const curNodeVersion = process.version
    if (!semver.gte(curNodeVersion, LOWEST_NODE_VERSION)) {
        throw new Error(colors.red( `ayuan-cli 最低需要 v${LOWEST_NODE_VERSION} 以上版本的 Node.js 支持`))
    }
}

function checkPkgVersion() {
    // console.log(pkg.version)
    // log.success('try', 'success')
    log.info(`欢迎使用ayuan-cli，当前版本为 ${pkg.version}`)
}


